/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.beans;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import org.cip.esymons.general.be.PersonaJuridica;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.tesoreria.bc.ChequeraFacadeLocal;
import org.cip.esymons.tesoreria.bc.ComprobanteEgresoDelegate;
import org.cip.esymons.tesoreria.bc.CuentaBancariaDelegate;
import org.cip.esymons.tesoreria.bc.EjecutarGeneracionVoucherLocal;
import org.cip.esymons.tesoreria.bc.FormaPagoDelegate;
import org.cip.esymons.tesoreria.bc.PersonaJuridicaDelegate;
import org.cip.esymons.tesoreria.be.ComprobanteEgreso;
import org.cip.esymons.tesoreria.be.CuentaBancaria;
import org.cip.esymons.tesoreria.be.DetComegreso;
import org.cip.esymons.tesoreria.be.EnumEstadoComprobanteEgreso;
import org.cip.esymons.tesoreria.be.FormaPago;
import org.cip.esymons.tramite.be.DocumentoExterno;

/**
 *
 * @author Gilmar
 */
public class VoucherEgresoController extends ControladorAbstracto {

    @EJB
    EjecutarGeneracionVoucherLocal delegado;
    @EJB
    ChequeraFacadeLocal chequeraFacadeLocal;
    private String dnioNroCip;
    private PersonaJuridicaDelegate delegadoPersonaJuridica;
    private CuentaBancariaDelegate cuentaBancariaDelegate;
    private FormaPagoDelegate formaPagoDelegate;
    private ComprobanteEgresoDelegate comprobanteEgresoDelegate;
    private Long codigoVoucher;

    public VoucherEgresoController() {
        delegadoPersonaJuridica = new PersonaJuridicaDelegate();
        cuentaBancariaDelegate = new CuentaBancariaDelegate();
        formaPagoDelegate = new FormaPagoDelegate();
        comprobanteEgresoDelegate = new ComprobanteEgresoDelegate();
    }

    public String nuevo() {
        String mensaje = getRequestParameter("buscarVoucher:errores");
        delegado.init();
        if (!mensaje.trim().isEmpty()) {
            String[] mensajes = mensaje.split("/");
            for (String men : mensajes) {
                error(men);
            }
        }
        return "nuevo";
    }

    public String getErrores() {
        return obtenerMensajesErrores();
    }

    public void setErrores(String e) {
    }

    public String getObtenerCodigoReporte() {
        try{
            String codigoDocPago = ControladorAbstracto.getSessionProperty("reporteVoucher").toString();
            ControladorAbstracto.removeSessionProperty("reporteVoucher");
            return codigoDocPago;
        }catch(Exception e){
            return "0";
        }
    }

    public void setObtenerCodigoReporte(String ob) {
    }

    public String grabar() {
        if (delegado.getRealizarGeneracionVoucherLocal().getSolicitanteSeleccionado() == null) {
            error("Debe Ingresar a la Persona para quien se genera el Voucher.");
            return null;
        }
        if (delegado.getRealizarGeneracionVoucherLocal().getComprobanteEgreso().getConcepto().trim().isEmpty()) {
            error("Debe Ingresar el concepto por el cual se genera el Voucher.");
            return null;
        }
        if (delegado.getRealizarGeneracionVoucherLocal().getComprobanteEgreso().getCuentaBancariaDelCip() == null) {
            error("Debe Seleccionar la cuenta Bancaria del CIP CDLL.");
            return null;
        }
        if (delegado.getRealizarGeneracionVoucherLocal().getListaDetalleCuentaEgreso().isEmpty() && delegado.getRealizarGeneracionVoucherLocal().getComprobanteEgreso().getEstado().equals(EnumEstadoComprobanteEgreso.GENERADO)) {
            error("Debe agregar al menos un detalle al Voucher.");
            return null;
        }
        delegado.getRealizarGeneracionVoucherLocal().grabar();
        if (delegado.getRealizarGeneracionVoucherLocal().getComprobanteEgreso().getEstado().equals(EnumEstadoComprobanteEgreso.GENERADO)) {
            ControladorAbstracto.setSessionProperty("reporteVoucher", delegado.getRealizarGeneracionVoucherLocal().getComprobanteEgreso().getDocCodigo());
        }
        delegado.getRealizarGeneracionVoucherLocal().cancelar();
        info("Se grabó satisfactoriamente el Voucher");
        return "buscar";
    }

    public String grabarCambioAGenerado() {
        delegado.getRealizarGeneracionVoucherLocal().grabarCambioGenerado();
        info("Se grabó satisfactoriamente el Voucher");
        return "buscar";
    }

    public String nuevoDetalle() {
        DetComegreso dce = new DetComegreso();
        dce.setComprobanteMotivoDePago(new DocumentoExterno());
        delegado.getRealizarGeneracionVoucherLocal().setDetalle(dce);
        delegado.getRealizarGeneracionVoucherLocal().setNombreDetalle(null);
        delegado.getRealizarGeneracionVoucherLocal().setNombreTipoDocumento(null);

        return "detalle";
    }

    public String agregarDetalle() {
        delegado.getRealizarGeneracionVoucherLocal().agregarDetalle();
        return "nuevo";
    }

    public String nuevoDetalleCambioAGenerado() {
        DetComegreso dce = new DetComegreso();
        dce.setComprobanteMotivoDePago(new DocumentoExterno());
        delegado.getRealizarGeneracionVoucherLocal().setDetalle(dce);
        return "nuevo";
    }

    public String agregarDetalleCambioAGenerado() {
        delegado.getRealizarGeneracionVoucherLocal().agregarDetalle();
        return "detalle";
    }

    public String verDetalleVoucher() {
        return "ver_detalle";
    }

    public String verDetalleParaCambioAGenerado() {
        delegado.init();
        return "ver_detalle_cambio_generado";
    }

    public String getFijarVoucherEgreso() {
        try {
            ComprobanteEgreso ce = comprobanteEgresoDelegate.find(codigoVoucher);
            if (ce != null) {
                delegado.getRealizarGeneracionVoucherLocal().setComprobanteEgreso(ce);
            }
        } catch (Exception ex) {
            System.out.println("Error codigo mal");
        }
        return "";
    }

    public void setFijarVoucherEgreso(String egreso) {
        System.out.println("Escribiendo");
    }

    public List<DetComegreso> getListaDetalleVoucher() {
        try {
            return comprobanteEgresoDelegate.listaDetalle(codigoVoucher);
        } catch (Exception ex) {
            return new ArrayList<DetComegreso>();
        }
    }

    public String cancelar() {
        delegado.getRealizarGeneracionVoucherLocal().cancelar();
        return "buscar";
    }

    public List<ComprobanteEgreso> getListaComprobanteEgreso() {
        return comprobanteEgresoDelegate.getListaComprobantes();
    }

    public String getFijarNumeroCheque() {
        return delegado.getRealizarGeneracionVoucherLocal().getFijarNumCheque();
    }

    public void escuchaChequera(ValueChangeEvent event) {
        if (delegado.getRealizarGeneracionVoucherLocal().getComprobanteEgreso().getFormaDePago().getFpaDesc().toLowerCase().indexOf("cheque") >= 0) {
            CuentaBancaria cb = (CuentaBancaria) event.getNewValue();
            Object[] o = chequeraFacadeLocal.obtenerNumeracionActual(cb);
            if (o[0].equals("000")) {
                ControladorAbstracto.warn("No existe chequera para la cuenta " + cb.getCbaNumcuenta() + ".Creela por favor.");
            }
        }
    }

    public String buscarPersona() {
        delegado.getRealizarGeneracionVoucherLocal().buscarPersona(dnioNroCip);
        return null;
    }

    public String busquedaAvanzada() {
        BusquedaPersonasController bpcCB = (BusquedaPersonasController) getBean("busquedaPersonasController");
        bpcCB.setControladorSolicitante(10);
        bpcCB.setDniPerNat(null);
        bpcCB.setApeMatPerNat(null);
        bpcCB.setApePatPerNat(null);
        bpcCB.setDniPerNat(null);
        bpcCB.setNomPerNat(null);
        bpcCB.setRazsocPerJur(null);
        bpcCB.setRucCliente(null);
        bpcCB.setTipoPersonaSeleccionada("NA");
        return "busquedaAvanzada";
    }

    public String mostrarDeuda() {
        return "verDeuda";
    }

    public String seleccionarCuotasAPagar() {
        return "nuevo";
    }

    public int getTipoBusquedaDNICIP() {
        return delegado.getRealizarGeneracionVoucherLocal().getTipoBusquedaDNICIP();
    }

    public void setTipoBusquedaDNICIP(int num) {
        delegado.getRealizarGeneracionVoucherLocal().setTipoBusquedaDNICIP(num);
    }

    public ComprobanteEgreso getComprobanteEgreso() {
        return delegado.getRealizarGeneracionVoucherLocal().getComprobanteEgreso();
    }

    public void setComprobanteEgreso(ComprobanteEgreso comprobanteEgreso) {
        delegado.getRealizarGeneracionVoucherLocal().setComprobanteEgreso(comprobanteEgreso);
    }

    public Solicitante getSolicitanteSeleccionado() {
        return delegado.getRealizarGeneracionVoucherLocal().getSolicitanteSeleccionado();
    }

    public void setSolicitanteSeleccionado(Solicitante solicitanteSeleccionado) {
        delegado.getRealizarGeneracionVoucherLocal().setSolicitanteSeleccionado(solicitanteSeleccionado);
    }

    public PersonaJuridica getPersonaJuridica() {
        return delegado.getRealizarGeneracionVoucherLocal().getPersonaJuridica();
    }

    public void setPersonaJuridica(PersonaJuridica personaJuridica) {
        delegado.getRealizarGeneracionVoucherLocal().setPersonaJuridica(personaJuridica);
    }

    public CuentaBancaria getCuentaBancariaSolicitante() {
        return delegado.getRealizarGeneracionVoucherLocal().getCuentaBancariaSolicitante();
    }

    /**
     * @param cuentaBancariaSolicitante the cuentaBancariaSolicitante to set
     */
    public void setCuentaBancariaSolicitante(CuentaBancaria cuentaBancariaSolicitante) {
        delegado.getRealizarGeneracionVoucherLocal().setCuentaBancariaSolicitante(cuentaBancariaSolicitante);
    }

    public DetComegreso getDetComegreso() {
        return delegado.getRealizarGeneracionVoucherLocal().getDetalle();
    }

    /**
     * @param cuentaBancariaSolicitante the cuentaBancariaSolicitante to set
     */
    public void setDetComegreso(DetComegreso detalle) {
        delegado.getRealizarGeneracionVoucherLocal().setDetalle(detalle);
    }

    public List<DetComegreso> getListaDetalleCuentaEgreso() {
        return delegado.getRealizarGeneracionVoucherLocal().getListaDetalleCuentaEgreso();
    }

    public String getNombreDetalle() {
        return delegado.getRealizarGeneracionVoucherLocal().getNombreDetalle();
    }

    public void setNombreDetalle(String nombreDetalle) {
        delegado.getRealizarGeneracionVoucherLocal().setNombreDetalle(nombreDetalle);
    }

    public String getNombreTipoDocumento() {
        return delegado.getRealizarGeneracionVoucherLocal().getNombreTipoDocumento();
    }

    public void setNombreTipoDocumento(String nombreTipoDocumento) {
        delegado.getRealizarGeneracionVoucherLocal().setNombreTipoDocumento(nombreTipoDocumento);
    }

    /**
     * @param cuentaBancariaSolicitante the cuentaBancariaSolicitante to set
     */
    public void setListaDetalleCuentaEgreso(List<DetComegreso> listaDetalle) {
        delegado.getRealizarGeneracionVoucherLocal().setListaDetalleCuentaEgreso(listaDetalle);
    }

    /**
     * @return the dnioNroCip
     */
    public String getDnioNroCip() {
        return dnioNroCip;
    }

    /**
     * @param dnioNroCip the dnioNroCip to set
     */
    public void setDnioNroCip(String dnioNroCip) {
        this.dnioNroCip = dnioNroCip;
    }

    public SelectItem[] getBancoItems() {
        try {
            List<PersonaJuridica> lba = new ArrayList<PersonaJuridica>();
            lba = delegadoPersonaJuridica.listarTodosBancos();
            SelectItem[] select = new SelectItem[lba.size()];
            int i = 0;
            for (PersonaJuridica ba : lba) {
                SelectItem item = new SelectItem(ba, ba.getEmprazonSocial());
                select[i++] = item;
            }

            if (delegado.getRealizarGeneracionVoucherLocal().getComprobanteEgreso().getFormaDePago().getFpaDesc().toLowerCase().indexOf("deposito") >= 0) {
                if (delegado.getRealizarGeneracionVoucherLocal().getCuentaBancariaSolicitante() != null) {
                    PersonaJuridica pj = cuentaBancariaDelegate.buscarBancodeCB(delegado.getRealizarGeneracionVoucherLocal().getCuentaBancariaSolicitante().getCbaNumcuenta());
                    delegado.getRealizarGeneracionVoucherLocal().setPersonaJuridica(pj);
                }
            }

            return select;

        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Bancos");
            select[0] = item;
            return select;
        }
    }

    public SelectItem[] getCuentasBancariasItems() {
        try {
            List<CuentaBancaria> lba = new ArrayList<CuentaBancaria>();
            lba = cuentaBancariaDelegate.buscarPorBanco(delegado.getRealizarGeneracionVoucherLocal().getPersonaJuridica());
            SelectItem[] select = new SelectItem[lba.size()];
            int i = 0;
            for (CuentaBancaria ba : lba) {
                SelectItem item = new SelectItem(ba, ba.getCbaNumcuenta() + "-" + ba.getFkTmoCodigo().getTmoSimbolo());
                select[i++] = item;
            }
            return select;

        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Cuentas");
            select[0] = item;
            return select;
        }
    }

    public SelectItem[] getCuentasBancariasxSolicitanteItems() {
        try {
            List<CuentaBancaria> lba = new ArrayList<CuentaBancaria>();
            lba = cuentaBancariaDelegate.buscarCBPorSolicitante(delegado.getRealizarGeneracionVoucherLocal().getSolicitanteSeleccionado());
            SelectItem[] select = new SelectItem[lba.size()];
            int i = 0;
            for (CuentaBancaria ba : lba) {
                SelectItem item = new SelectItem(ba, ba.getFkBanCodigo().getEmprazonSocial() + "-" + ba.getCbaNumcuenta() + "-" + ba.getFkTmoCodigo().getTmoSimbolo());
                select[i++] = item;
            }

            return select;

        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Cuentas");
            select[0] = item;
            return select;
        }
    }

    public SelectItem[] getFormaPagoItems() {
        try {
            List<FormaPago> lba = new ArrayList<FormaPago>();
            lba = formaPagoDelegate.findAll();
            SelectItem[] select = new SelectItem[lba.size()];
            int i = 0;
            for (FormaPago ba : lba) {
                SelectItem item = new SelectItem(ba, ba.getFpaDesc());
                select[i++] = item;
            }
            return select;
        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Formas de Pago");
            select[0] = item;
            return select;
        }
    }

    public String getFomadePago() {
        try {
            if (delegado.getRealizarGeneracionVoucherLocal().getComprobanteEgreso().getFormaDePago().getFpaDesc().toLowerCase().indexOf("cheque") >= 0) {
                return "Cheque";
            } else {
                if (delegado.getRealizarGeneracionVoucherLocal().getComprobanteEgreso().getFormaDePago().getFpaDesc().toLowerCase().indexOf("deposito") >= 0) {
                    return "Deposito";
                } else {
                    return "Otro";
                }
            }
        } catch (Exception ex) {
            return "Nada";
        }
    }

    /**
     * @return the comprobanteEgresoDelegate
     */
    public ComprobanteEgresoDelegate getComprobanteEgresoDelegate() {
        return comprobanteEgresoDelegate;
    }

    /**
     * @param comprobanteEgresoDelegate the comprobanteEgresoDelegate to set
     */
    public void setComprobanteEgresoDelegate(ComprobanteEgresoDelegate comprobanteEgresoDelegate) {
        this.comprobanteEgresoDelegate = comprobanteEgresoDelegate;
    }

    /**
     * @return the codigoVoucher
     */
    public Long getCodigoVoucher() {
        try {
            codigoVoucher = Long.decode(ControladorAbstracto.getRequestParameter("codigoVoucher"));
        } catch (Exception ex) {
            System.out.println("Error codigo mal");
        }
        return codigoVoucher;
    }

    /**
     * @param codigoVoucher the codigoVoucher to set
     */
    public void setCodigoVoucher(Long codigoVoucher) {
        this.codigoVoucher = codigoVoucher;
    }
}
